﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace MakeIT.Deo.Negocios
{
    /// <summary>
    /// Classe que reune os métodos relativos ao Familia - Herda da classe base NegocioBase
    /// </summary>
    public class SubFamiliaBO
    {

        private deoEntities modelo = null;

        public SubFamiliaBO()
        {
            modelo = new deoEntities();
        }

        /// <summary>
        /// Salva um novo registro ou atualiza um já existente
        /// </summary>
        /// <param name="entidade">Objeto a ser gravado/atualizadao em banco de dados</param>
        /// <param name="novo">Determina se um novo registro ou não</param>
        public void SalvarSubFamilia(subfamilia entidade, Boolean novo)
        {
            try
            {

                // Verifica se eh um registro novo
                if (novo)
                {
                    // Insere o regisro na tabela de Familia
                    modelo.AddTosubfamilia(entidade);
                }
                else
                {
                    //Efetiva as mudanças na entidade já existente
                    modelo.ApplyPropertyChanges(entidade.EntityKey.EntitySetName, entidade);
                }

                // Efetiva a trasação no Banco
                modelo.SaveChanges();
                
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public List<subfamilia> RecuperaSubFamilia(int? idSubFamilia, string subFamilia)
        {
            return RecuperaSubFamilia(idSubFamilia, subFamilia, null, null, false);
        }

        /// <summary>
        /// Recupera uma lista de Familia 
        /// </summary>
        /// <param name="idSubFamilia">Codigo do Familia</param>
        /// <param name="nomeFamilia">Nome do familia usado no filtro da query (like)</param>
        /// <returns>Lista de Familia</returns>
        public List<subfamilia> RecuperaSubFamilia(int? idSubFamilia, string subFamilia, string referencia, int? idFamilia, bool simultaneoSubFamRef)
        {

            try
            {
                // Declara objetos
                IQueryable<subfamilia> query = modelo.subfamilia;

                // Verifica se o código do subfamilia é diferente de nulo
                if (idSubFamilia != null)
                {
                    // monta query dinamica
                    query = query.Where(a => a.IdSubFamilia == idSubFamilia);
                }
                // Verifica se o código do familia é diferente de nulo
                if (idFamilia != null)
                {
                    // monta query dinamica
                    query = query.Where(a => a.IdFamilia == idFamilia);
                }

                if (!string.IsNullOrEmpty(subFamilia) && !string.IsNullOrEmpty(referencia) && simultaneoSubFamRef)
                {
                    query = query.Where(a => a.SubFamilia.Contains(subFamilia) || a.Referencia.Equals(referencia));
                }
                else
                {
                    // Verifica se filtro nomesubFamilia é diferente de vazio ou nulo
                    if (!string.IsNullOrEmpty(subFamilia))
                    {
                        // monta query dinamica
                        query = query.Where(a => a.SubFamilia.Contains(subFamilia));
                    }

                    // Verifica se filtro email é diferente de vazio ou nulo
                    if (!string.IsNullOrEmpty(referencia))
                    {
                        // monta query dinamica
                        query = query.Where(a => a.Referencia.Equals(referencia));
                    }
                }

                // Executa Query
                var retornaLista = from subfam in query
                                   join familia in modelo.familia on subfam.IdFamilia equals familia.IdFamilia
                                   orderby subfam.SubFamilia
                                   select subfam;
                /*{
                    CadastradoPor = subfam.CadastradoPor, 
                    EditadoPor = subfam.EditadoPor,
                    Cadastro = subfam.Cadastro,
                    Edicao = subfam.Edicao,
                    IdFamilia = subfam.IdFamilia
                    IdSubFamilia = subfam.IdSubFamilia, 
                    Referencia = subfam.Referencia, 
                    SubFamilia = subfam.SubFamilia,
                    fotog = subfam.fotog,
                    Fotop = subfam.Fotop,
                    Familia = familia.Familia
                }*/

                if (retornaLista.Count() > 0)
                {
                    return retornaLista.ToList();
                }
                else
                {
                    return null;
                }

            }
            catch (Exception e)
            {

                throw e; //TODO: Tratar a exceção
            }
        }

        /// <summary>
        /// Recupera o Familia pelo código.
        /// </summary>
        /// <param name="idSubFamilia">Código do Familia</param>
        /// <returns>Lista de familia</returns>
        public subfamilia RecuperaSubFamilia(int? idSubFamilia)
        {
            List<subfamilia> listaSubFamilia = RecuperaSubFamilia(idSubFamilia, null, null, null, false);
            if (listaSubFamilia != null && listaSubFamilia.Count > 0)
                return listaSubFamilia[0];
            else
                return null;
        }

        /// <summary>
        /// Recupera o Familia pelo nome (like)
        /// </summary>
        /// <param name="nomeFamilia">Nome do Familia</param>
        /// <returns>Lista de familias</returns>
        public List<subfamilia> RecuperaSubFamilia(string nomeSubFamilia)
        {
            return RecuperaSubFamilia(null, nomeSubFamilia, null, null, false);
        }

        /// <summary>
        /// Recupera todos os registros Familia
        /// </summary>        
        /// <returns>Lista de Familias</returns>
        public List<subfamilia> RecuperaSubFamilia()
        {
            // chama o método de mesmo nome (overload) passando apenas o parametro pertinente
            return this.RecuperaSubFamilia(null, null, null, null, false);
        }

        /// <summary>
        /// Excluir um determinado registro 
        /// </summary>
        /// <param name="entidade">Registro a ser excluido</param>
        /// <param name="msg"></param>
        /// <returns>Retorna uma msg quando há, a qual sinaliza algum fluxo alternativo</returns>
        public void DeletaSubFamilia(subfamilia subFamilia)
        {
            try
            {
                EntityKey key = new EntityKey(modelo.DefaultContainerName + ".subfamilia", "IdSubFamilia", subFamilia.IdSubFamilia);
                modelo.DeleteObject(modelo.GetObjectByKey(key));
                modelo.SaveChanges();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

    }

}
